package com.example.proxytest.proxy.dynamicproxy.jdk;

import com.example.proxytest.proxy.MyTransaction;
import com.example.proxytest.proxy.PersonService;
import com.example.proxytest.proxy.PersonServiceImpl;

import java.lang.reflect.Proxy;

/* ━━━━━━佛祖保佑━━━━━━
 *                  ,;,,;
 *                ,;;'(    社
 *      __      ,;;' ' \   会
 *   /'  '\'~~'~' \ /'\.)  主
 * ,;(      )    /  |.     义
 *,;' \    /-.,,(   ) \    码
 *     ) /       ) / )|    农
 *     ||        ||  \)
 *     (_\       (_\
 * ━━━━━━永无BUG━━━━━━
 * @author ：zjq
 * @date ：2020/9/7 14:17
 * @description: TODO jdk实现：debug 启动 打印出来 和 直接run 是不一样的 直接run 的效果是正常的
 *                单步调试时IDEA会调用被代理类的toString()方法，代理UserDao类会代理该类的所有方法（包括toString），因此会重复输出时间。
 * @version: V1.0
 * @slogan: 天下风云出我辈，一入代码岁月催
 */
public class Main {
    public static void main(String[] args) {
        //输出 动态代理 源码
        System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

        // 目标 对象
        Object target = new PersonServiceImpl();
        // 增强器
        MyTransaction myTransaction = new MyTransaction();
        PersonServiceInterceptor handler = new PersonServiceInterceptor(target, myTransaction);

        // jdk proxy
        PersonService personService = (PersonService) Proxy.
                newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);


        String returnValue = (String) personService.savePerson();

        System.out.println(returnValue);

        System.out.println("==============================");
        personService.updatePerson();

    }
}
